package com.exception;

import com.basemodel.Result;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.servlet.http.HttpServletResponse;
import java.util.HashMap;
import java.util.Map;

/**
 * @author: cxt
 * @time: 2021/3/10
 * <p>
 * `@ControllerAdvice`
 * 1、全局异常捕获
 * 2、全局绑定数据
 * 3、全局数据预处理
 */
@Slf4j
@ControllerAdvice
public class OverallException {

    /**
     * 处理自定义的业务异常
     * 需要在这里进行捕获，不然无法响应给前端
     */
    @ExceptionHandler(value = ApiException.class)
    @ResponseBody
    public Result<Object> custom(HttpServletResponse req, ApiException e) {
        req.setStatus(e.getCode()); // 自定义的状态设置成响应给前端的状态
        log.error("系统异常！原因是：{}", e.getMessage());
        return Result.error(e.getCode(), e.getMessage(), e.getData());
    }

    /**
     * 全局数据绑定
     * 任何一个Controller 的接口中，都可以获取到这里定义的数据
     *
     * @ModelAttribute 可以指定name也可以不指定
     */
    @ModelAttribute(name = "myName")
    public Map<String, Object> binding() {
        HashMap<String, Object> map = new HashMap<>();
        map.put("modelTest", "这是测试的数据");
        return map;
    }


}
